package jhlee42;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class J21HelloJDBC {
	// JDBC : java DataBase Connective?

	public static void main(String[] args) {
		String DRV ="oracle.jdbc.OracleDriver"; // 이 code 는  있어야한다. // 동적으로 클래스를 만든다.
		String URL ="jdbc:oracle:thin:@127.0.0.1:1521:xe";
		String USR ="scott";
		String PWD ="TIGER";
		
		// java.sql의 connection
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
			
		// 데이터 베이스 조회
		String sql ="select * from emp";
		
		try {
			// 1. JDBC 드라이버 로드
			// forName 메서드로 동적으로 객체 생성 // Class.forname() 으로 객체를 생성할 수 있다. 
			Class.forName(DRV); 
			// 2. 데이터베이스 연결
			// .getConnection 메서드에 접속 정보가 있는 URL과 계정정보 및 암호인 USR ,PWD를 매개변수로 넘김.
			conn = DriverManager.getConnection(URL,USR,PWD);
			System.out.println("오라클 서버 접속 성공");
			// 3. 실행할 SQL 질의문 생성
			// SQL 질의문은 String 변수에 작성
			// prepareStatement 메서드를 통해 prepareStatement 객체로 생성
			// statement,preparestatement
			pstmt = conn.prepareStatement(sql);
			// 4. SQL 질의문 실행
			// executeQuery 메서드로 SQL 질의문을 실행할 수 있음
			// 5. 실행 결과집합 받기
			// SQL 질의문이 select 라면 실행 후 결과 집합이 발생됨.
			rs = pstmt.executeQuery();
			
			StringBuilder sb = new StringBuilder();
			//6. 결과집합 처리
			// next 메서드로 결과행 존재여부를 확인하고
			// getString 메서드로 해당 필드값을 출력.
			while (rs.next()) { // .next() 가 들어가면, 데이터를 가져갈 포인트를 하나씩 알려줌.
				
				sb.append(rs.getString(1))
				.append("/")
				.append(rs.getString("ename"))
				
				.append("/")
				.append(rs.getString("job"))
				
				.append("/")
				.append(rs.getString("sal"))

				.append("\n");		
			}
			System.out.println(sb);
		} 
		catch (ClassNotFoundException cnfe) {
			System.out.println("JDBC 드라이버를 확인하세요");
		}
		catch (Exception ex) {
			ex.printStackTrace();
		} 
		finally{
			// 7. 연결해제
			// JDBC 프로그래밍에 사용된
			// 모든 객체들은 메모리에서 해제시킴 
			// 나중에 생성한 것을 먼저 해제 한다.. 예 ) 생성 - 1,2,3 해체 3,2,1
			if(rs != null)
				try {conn.close();}
				catch (Exception e) {}
			if(pstmt != null)
				try {conn.close();}
				catch (Exception e) {}
			if(conn != null)
				try {conn.close();}
				catch (Exception e) {}
		}
	} // main
} // class
